package br.fiap.nac.DAO;

import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.fiap.nac.Classes.Pedido;
import br.fiap.nac.Classes.Produto;
import br.fiap.nac.Util.DBUtil;

public class PedidoDAO {
	
	public Long cadastrarPedido(Pedido pedido) throws SQLException {
		
		String sql = "INSERT INTO pedido (idCliente) VALUES (?)";
		
		PreparedStatement insert = DBUtil.connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
		insert.setLong(1, pedido.getCliente().getId());
		
		insert.execute();
		ResultSet rs = insert.getGeneratedKeys();  
	    Long id = 0L;  
	    if(rs.next())  
	    	id = (long)rs.getInt(1);  

		return id;
	}
	
	public boolean excluirPedido(Pedido pedido) throws SQLException {
		
		String sql = "DELETE FROM pedido WHERE id = ? and dataProcessamento is null";
		PreparedStatement delete = DBUtil.connection.prepareStatement(sql);
		delete.setLong(1, pedido.getId());
		
		int linha = delete.executeUpdate();
		
		if (linha > 0)
			return true;
		else 
			return false;
	}
	
	public Pedido getPedido(Pedido ped) {
		
		Pedido pedido = null;
		try { 
			
			
			String sql = "";
			PreparedStatement select;
			
			sql = "SELECT ID, IDCLIENTE, DATAEMISSAO, DATAPROCESSAMENTO, TOTALPEDIDO FROM PEDIDO WHERE ID = ?";
			select = DBUtil.connection.prepareStatement(sql);
			select.setLong(1, ped.getId());
	
			ResultSet rs = select.executeQuery();
	
			if (rs.next()) {
				pedido = new Pedido();
				pedido.setId(rs.getLong(1));
				pedido.setDataEmissao(rs.getTimestamp(3));
				pedido.setDataProcessamento(rs.getTimestamp(4));
				pedido.setTotalPedido(rs.getBigDecimal(5));
	
				pedido.setListaItemPedido(new ItemPedidoDAO().getListItemPedido(rs.getLong(1)));
				pedido.setCliente(new ClienteDAO().pesquisarClientePorId(rs.getLong(2)));
			}
		}catch(Exception e) {
			System.out.println(e.getMessage()+"***");
		}
	
			return pedido;
	}
	
	public Boolean pedidoProcessado(Long idPedido) {
		String sql = "";
		PreparedStatement select;
		
		Boolean retorno = false;
		
		try{
			sql = "SELECT CASE WHEN DATAPROCESSAMENTO IS NULL THEN FALSE ELSE TRUE END AS PEDIDOPROCESSADO FROM PEDIDO WHERE ID = ?";
			select = DBUtil.connection.prepareStatement(sql);
			select.setLong(1, idPedido);
	
			ResultSet rs = select.executeQuery();
	
			if (rs.next()) {
				retorno=(rs.getBoolean(1));
			}
		}catch(Exception e) {
			System.out.println(e.getMessage()+"***ERRO AO CONSULTAR PEDIDO PROCESSADO");
		}
		return retorno;
	}
	
	public Boolean pedidoExiste(Long idPedido) {
		String sql = "";
		PreparedStatement select;
		
		Boolean retorno = false;
		
		try{
			sql = "SELECT ID FROM PEDIDO WHERE ID = ?";
			select = DBUtil.connection.prepareStatement(sql);
			select.setLong(1, idPedido);
	
			ResultSet rs = select.executeQuery();
	
			retorno=rs.next();
		}catch(Exception e) {
			System.out.println(e.getMessage()+"***");
		}
		return retorno;
	}
	
	public void processarPedido(Long idPedido) throws SQLException {
		String sqlItem, sqlPedido = "";
		PreparedStatement select = null;
		
		try{
			sqlItem = "UPDATE ITEMPEDIDO SET QUANTIDADE = CASE WHEN (SELECT P.ESTOQUE FROM PRODUTO P WHERE P.ID = ITEMPEDIDO.IDPRODUTO) < QUANTIDADE THEN NULL ELSE QUANTIDADE END WHERE IDPEDIDO = ?";
			select = DBUtil.connection.prepareStatement(sqlItem);
			select.setLong(1, idPedido);
			select.executeUpdate();
		}catch(Exception e) {
			System.out.println("***ERRO SQL ITENPEDIDO"+e.getMessage());
		}
		try{
			sqlPedido = "UPDATE PEDIDO SET DATAPROCESSAMENTO=NOW() WHERE ID = ?";
			select = DBUtil.connection.prepareStatement(sqlPedido);
			select.setLong(1, idPedido);
			select.executeUpdate();
		}catch(Exception e) {
			System.out.println("***ERRO SQL PEDIDO"+e.getMessage());
		}
	}

	public void atualizarEstoque(Long idPedido) {
		String sql = "";
		PreparedStatement update;
		
		try{
			sql = "UPDATE PRODUTO SET ESTOQUE = ESTOQUE - (SELECT QUANTIDADE FROM ITEMPEDIDO WHERE IDPEDIDO = ? AND IDPRODUTO=PRODUTO.ID) WHERE ID IN (SELECT IDPRODUTO FROM ITEMPEDIDO WHERE IDPEDIDO = ?)";
			update = DBUtil.connection.prepareStatement(sql);
			update.setLong(1, idPedido);
			update.setLong(2, idPedido);
			
			update.executeUpdate();
		}catch(Exception e) {
			System.out.println("***ERRO AO ATUALIZAR ESTOQUE"+e.getMessage());
		}
	}
	
	public List<Pedido> pesquisarPedido(Pedido pedido) throws SQLException, Exception {

		List<Pedido> listaPedidos = new ArrayList<Pedido>();
		
		String sql = "";
		PreparedStatement select;
		
		if(pedido.getId() != null)		{
			//Pesquisa por id
			sql = "SELECT ID, DATAEMISSAO, DATAPROCESSAMENTO, TOTALPEDIDO "
					+ "FROM PEDIDO "
					+ "WHERE ID = ?";
			select = DBUtil.connection.prepareStatement(sql);
			select.setLong(1, pedido.getId());
			
		}
		else if(pedido.getCliente() != null && pedido.getCliente().getId() != null){
			//Pesquisa pelo comeco da descricao
			sql = "SELECT ID, DATAEMISSAO, DATAPROCESSAMENTO, TOTALPEDIDO "
					+ "FROM PEDIDO "
					+ "WHERE IDCLIENTE = ?";
			select = DBUtil.connection.prepareStatement(sql);
			select.setLong(1, pedido.getCliente().getId());
		}
		else
			return null;
		
		ResultSet rs = select.executeQuery();

		if (rs != null) {
			while (rs.next()) {
				Pedido ped = new Pedido();
				
				ped.setId(rs.getLong(1));
				ped.setDataEmissao(rs.getDate(2));
				ped.setDataProcessamento(rs.getDate(3));
				ped.setTotalPedido(rs.getBigDecimal(4));
				ped.setListaItemPedido(new ItemPedidoDAO().getListItemPedido(ped.getId()));
				
				listaPedidos.add(ped);
			}
			return listaPedidos;
		}
		return null;
	}
}
